<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #app{
            border: 1px solid #cccccc;
            padding: 10px;
        }
        .box{
            border: 1px solid #cccccc;
            margin-left: 50px;
            padding: 10px;
        }
        p{
            padding-left: 20px;
        }
        input{
            margin-left: 20px;
        }
    </style>
    <script src="./js/vue.js"></script>
</head>
<body>
    <div id="app">
        <h3>父组件</h3>
        <child-one @funa="printFuna"></child-one>
        <hr>
        <child-two></child-two>
    </div>
</body>
<script type="text/x-template" id="one">
    <div class="box">
        <h3>子组件-one-范围</h3>
        <input type="button" value="输出_events" @click="printEvent()"><br><br>
        <input type="button" value="触发once绑定的事件" @click="emitOnceEvent()">
        <input type="button" value="触发off销毁事件" @click="destroyedEvent()">

    </div>
</script>
<script type="text/x-template" id="two">
    <div class="box">
        <h3>子组件-two-范围</h3>
    </div>
</script>
<script>
    /*
    实例方法 / 事件
        vm.$on(自定义事件名,事件的回调函数)   
            对指定vue实例的 _events 增加新的自定义事件
        vm.$once(自定义事件名,事件的回调函数)   
            对指定vue实例的 _events 增加新的一次性自定义事件（调用一次后立即销毁）
        vm.$off(需要被销毁的事件名称)
            对指定vue实例的 _events 进行指定自定义事件的删除
        vm.$emit 对指定vue实例的 _events 中记录的自定义事件进行调用触发，并传递$event参数
    */
    let eventBus = new Vue();
    // Vue的真实项目中的事件总线，一般由 实例属性 vm.$root 提供
    //      vm.$root  当前组件树的根 Vue 实例。如果当前实例没有父实例，此实例将会是其自己。

    Vue.component("ChildOne",{
        template:"#one",
        data(){
            return {
                temp:""
            }
        },
        methods: {
            printEvent(){
                console.log(this._events);
            },
            emitOnceEvent(){
                this.$emit("func");
            },
            destroyedEvent(){
                this.$off("funb");
            }
        },
        created() {
            this.$on("funb",()=>{});
            this.$on("funb",()=>{});

            this.$once("func",()=>{});
            this.$on("func",()=>{});

            // 完成对全局vue实例对象 eventBus 进行自定义事件绑定
            eventBus.$on("update-info",(params)=>{
                console.log(params);
                this.temp = params;
            });
        }
    });
    Vue.component("ChildTwo",{
        template:"#two",
        data(){
            return {
                info:"组件2的数据变量info"
            }
        },
        created() {
            eventBus.$emit("update-info",this.info)  
        },
    })

    new Vue({
        el:"#app",
        methods: {
            printFuna(){}
        },
        
    })
</script>
</html>